/*
 * @Author: your name
 * @Date: 2021-05-30 22:03:48
 * @LastEditTime: 2021-09-28 21:39:34
 * @LastEditors: Please set LastEditors
 * @Description: 界面管理类，该类一般都在awtk的队列里面使用，以对数据（特别是指针）进行保护。
 * 注意：该类为非线程安全类，多线程使用时要注意保护数据。100%保证在awtk消息队列使用，避免竞争问题。
 * @FilePath: \telescope720P\src\interface.h
 */
#ifndef INTERFACE_H
#define INTERFACE_H
#include "gui_engine.h"
#include "page_handle.h"
#include <list>
#include <mutex>
class Interface
{
public:
    Interface();
    virtual ~Interface();
    static Interface &GetInstance()
    {
        static Interface interface;
        if (instance)
        {
            return *instance;
        }
        else
        {
            return interface;
        }
    }
    static void SetInstance(Interface *p)
    {
        if (instance)
        {
            instance->CloseAllPage();
            delete instance;
        }
        instance = p;
    }
    virtual bool SetCurrentPage(PageHandle *page);
    virtual bool CloseCurrentPage();
    virtual void CloseAllPage();
    /**
     * @brief 
     * 回退到某个界面，如果这个界面不存在，回退到第一个界面
     * @param pageName 
     */
    virtual void BackToPage(std::string pageName);
    /**
     * @brief Get the Current Win object
     * 获取当前窗口
     * @return PageHandle* 
     */
    virtual PageHandle *GetCurrentWin();
    /**
     * @brief Get the Current Win object
     * 获取指定名字的当前窗口，在希望当前窗口是指定名字窗口时使用
     * @param pageName 窗口名字
     * @return PageHandle* 
     */
    virtual PageHandle *GetCurrentWin(std::string pageName);
    /**
     * @brief 
     * 遍历所有界面，重置超时计时。
     */
    virtual void ResetTimeOut();
    /**
     * @brief Get the Win By Name object
     * 在已经打开的窗口中通过名字获取窗口
     * @param pageName 
     * @return PageHandle* 
     */
    virtual PageHandle *GetWinByName(std::string pageName);
    std::mutex &PageProtect()
    {
        return currentPageMutex;
    }

private:
    /**
     * @brief 
     * 用于测试
     */
    static Interface *instance;
    Widget *currentPage;
    Widget *previousPage;
    std::list<PageHandle *> pageQueue;
    // std::mutex m_mutex;

public:
    /**
     * @brief 
     * 外界使用当前窗口指针时，对指针进行保护
     */
    std::mutex currentPageMutex;
};
#endif